Fork me on GitHub

Arithmétique modulaire

Nous avons déjà vu des exemples d’entiers modulaires au cours des séances de TD précédentes. Par exemple, nous avons travaillé avec les anneaux et lorsque nous avons étudié le chiffre de Hill et le chiffre VIC, et avec le corps lorsque nous avons étudié les Codes linéaires.

Nous allons maintenant étudier plus en profondeur l’arithmétique des entiers modulaires pour un quelconque.

Structure additive

  1. Lesquelles des égalités suivantes sont vraies? Lesquelles sont fausses?

  2. Calculer les produits suivants

  3. Calculer les tables d’addition et de multiplication de .

Jusqu’ici on s’est largement servi des propriétés de sans les démontrer: le moment est arrivé de vérifier que nos calculs sont bien fondés.

  1. Soit un entier quelconque, montrer les deux propriétés suivantes:

    • Si alors pour tout entier on a ,
    • Si alors pour tout entier on a .

Structure multiplicative

Voici la table de multiplication de . À partir de maintenant on va arrêter d’écrire partout: lorsque le module est clair du contexte, on se contentera d’écrire , plutôt que .

  0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
2 0 2 4 6 8 10 12 14 1 3 5 7 9 11 13
3 0 3 6 9 12 0 3 6 9 12 0 3 6 9 12
4 0 4 8 12 1 5 9 13 2 6 10 14 3 7 11
5 0 5 10 0 5 10 0 5 10 0 5 10 0 5 10
6 0 6 12 3 9 0 6 12 3 9 0 6 12 3 9
7 0 7 14 6 13 5 12 4 11 3 10 2 9 1 8
8 0 8 1 9 2 10 3 11 4 12 5 13 6 14 7
9 0 9 3 12 6 0 9 3 12 6 0 9 3 12 6
10 0 10 5 0 10 5 0 10 5 0 10 5 0 10 5
11 0 11 7 3 14 10 6 2 13 9 5 1 12 8 4
12 0 12 9 6 3 0 12 9 6 3 0 12 9 6 3
13 0 13 11 9 7 5 3 1 14 12 10 8 6 4 2
14 0 14 13 12 11 10 9 8 7 6 5 4 3 2 1
  1. Quel est l’inverse (multiplicatif) de 2, 4, 7?

  2. Trouver un élément qui n’a pas d’inverse multiplicatif.

  3. Combien d’éléments contient (le groupe des éléments inversibles de )?

  4. Calculer , et .

Pour tout élément inversible , on définit son ordre comme la plus petite puissance telle que .

  1. Quel est l’ordre de 2? de 13?

  2. Sans écrire de table de multiplication, calculer l’ordre de . Calculer .

Un peu d’algorithmique

Pas de squelette pré-remplie, cette fois-ci: ces programmes sont trop simples!

Exponentiation binaire

  1. Écrivez un programme qui prend en entrée trois entiers , et et qui calcule . Ne vous servez pas de la fonction Math.pow (ou de toute autre fonction de librairie Java).

  2. Calculez la complexité de votre algorithme: à et fixés, combien de multiplications fait-il?

Sans doute, vous avez utilisé une boucle for pour résoudre le point précédent, ce qui vous a donné un algorithme de complexité linéaire. On peut faire beaucoup mieux en utilisant l’exponentiation binaire.

L’idée de l’exponentiation binaire consiste à écrire en base 2 et à utiliser les propriétés des puissances. Vous avez déjà appliqué cet algorithme de façon intuitive lorsque vous avez fait des calculs à la main, par exemple:

Plutôt que faire 14 multiplications, vous n’avez donc qu’à calculer les éléments suivants (trois multiplications):

et à multiplier entre eux ceux qui apparaissent dans le produit (deux multiplications, dans ce cas).

Plus généralement, l’algorithme d’exponentiation binaire gauche-droite calcule de la façon suivante:

  1. Écrivez l’algorithme d’exponentiation binaire en utilisant une fonction récursive.

  2. Transformez l’algorithme précédent en un algorithme itératif (i.e. pas d’appel récursif, mais une boucle for ou while à la place).

  3. Quelle est la complexité des deux algorithmes?

Calcul d’ordre naïf

On ne connaît pas d’algorithme vraiment efficace pour calculer l’ordre d’un élément . Une méthode vraiment (trop) simple consiste à énumérer toutes les puissances , , , … jusqu’à trouver un tel que .

  1. Écrivez un programme qui prend en entrée deux entiers et et qui calcule l’ordre de modulo . Quelle est sa complexité?